package com.caece.ajedrez;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

import com.caece.ajedrez.Excepciones.DestionoIncorrectoException;
import com.caece.ajedrez.Excepciones.FichaContrariaException;
import com.caece.ajedrez.Excepciones.FichaEnElCaminoException;
import com.caece.ajedrez.Excepciones.FueraDeTableroException;
import com.caece.ajedrez.Excepciones.MovimientoException;
import com.caece.ajedrez.Excepciones.NoHayFichaException;
import com.caece.ajedrez.Fichas.Alfil;
import com.caece.ajedrez.Fichas.Ficha;
import com.caece.ajedrez.Fichas.Ficha.Color;
import com.caece.ajedrez.Fichas.Peon;
import com.caece.ajedrez.Fichas.Reina;
import com.caece.ajedrez.Fichas.Rey;
import com.caece.ajedrez.Fichas.Torre;
import com.caece.ajedrez.Movimientos.LogMovimiento;
import com.caece.ajedrez.Movimientos.Posicion;

public class TableroView {
	private static final String[] letras = new String[]{"a", "b", "c", "d", "e", "f", "g", "h"};
	private Tablero tablero;
	
	public TableroView (Tablero tablero){
		this.tablero = tablero;
	}
	
	public void dibujar(){
		dibujarTablero();
	}
	
	public void pedirEntrada(){
		tablero.esperandoJugador();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		try{
			Boolean error = true;
			while(error){
				if(tablero.hayJaque()){
					System.out.print("\n\nJaque");
				}
				System.out.print("\n\n"+getColorJugando()+" elija movimiento (Ej. B1-D1) (le quedan "+getTiempo()+" para jugar)");
				String s = br.readLine();
				if(s.length()==5){
					String[] movs = s.split("-");
					Integer desdeY = letraANumero(movs[0].charAt(0));
					Integer desdeX = new Integer(Character.getNumericValue(movs[0].charAt(1)));
					desdeX--;
					Integer hastaY = letraANumero(movs[1].charAt(0));
					Integer hastaX = new Integer(Character.getNumericValue(movs[1].charAt(1)));
					hastaX--;
					
					if(desdeX > -1 && hastaX > -1 && desdeY > -1 && hastaY > -1){
						Posicion desde = new Posicion(desdeX, desdeY);
						Posicion hasta = new Posicion(hastaX, hastaY);
						
						tablero.mover(desde, hasta);
						error = false;
					}else{
						System.out.println("\nNo existe la posicion. Vuelva a elegir");
					}
					
				}
			}
		}catch(IOException e){
			System.out.println("Error al leer. "+e);
		}catch (NoHayFichaException e) {
			System.out.println(e.getMessage());
		}catch (DestionoIncorrectoException e) {
			System.out.println(e.getMessage());
		}catch (FichaContrariaException e) {
			System.out.println(e.getMessage());
		}catch (FichaEnElCaminoException e) {
			System.out.println(e.getMessage());
		}catch (FueraDeTableroException e) {
			System.out.println(e.getMessage());
		}catch (MovimientoException e) {
			System.out.println("Error en el movimiento elegido");
		}
	}
	
	private String getTiempo() {
		Long tiempo = tablero.getJugadorJugando().getTiempo();
		Date date = new Date(tiempo);
		DateFormat formato = new SimpleDateFormat("mm:ss");
		String formateado = formato.format(date);
		
		return formateado;
	}

	private String getColorJugando(){
		String ret = "";
		
		if(tablero.getColorJugando().equals(Color.Blanco)){
			ret = "Blanco";
		}else{
			ret = "Negro";
		}
		
		return ret;
	}
   
  	private String getColorGanador(){
		String ret = "";
		
		if(tablero.getColorJugando().equals(Color.Blanco)){
			ret = "Negro";
		}else{
			ret = "Blanco";
		}
		
		return ret;
	}
	
	private Integer letraANumero(char charAt) {
		String s = String.valueOf(charAt).toLowerCase();
		Integer ret = Arrays.asList(letras).indexOf(s);
		return ret;
	}

	private void dibujarTablero(){
		int filaNro = 0;
		//muestro nros de columna
		for(int h=0; h<Tablero.SIZE; h++){
			System.out.print("  "+(h+1)+" ");
		}
		System.out.print("\n");
		for(int h=0; h<Tablero.SIZE; h++){
			System.out.print("----");
		}
		for(int i=0; i<Tablero.SIZE; i++){
			System.out.print("\n");
			for(int h=0; h<Tablero.SIZE; h++){
				System.out.print("|   ");
			}
			System.out.print("|\n");
			for(int j=0; j<Tablero.SIZE; j++){
				StringBuffer s = new StringBuffer("| ");
				Posicion pos = new Posicion(i, j);
				s.append(getLetraFicha(tablero.getFichaAt(pos)));
				s.append(" ");
				System.out.print(s);
			}
			System.out.print("| "+letras[filaNro].toUpperCase()+"\n");
			filaNro++;
			for(int h=0; h<Tablero.SIZE; h++){
				System.out.print("|   ");
			}
			System.out.print("|\n");
			for(int h=0; h<Tablero.SIZE; h++){
				System.out.print("----");
			}
			
		}
		//muestro nros de columna
		System.out.print("\n");
		for(int h=0; h<Tablero.SIZE; h++){
			System.out.print("  "+(h+1)+" ");
		}
	}
	
	private String getLetraFicha(Ficha ficha){
		String ret = "";
		
		if(ficha!=null){
			if(ficha instanceof Peon){
				ret = "p";
			}else if(ficha instanceof Alfil){
				ret = "a";
			}else if(ficha instanceof Reina){
				ret = "d";
			}else if(ficha instanceof Rey){
				ret = "r";
			}else if(ficha instanceof Torre){
				ret = "t";
			}
			
			if(ficha.isBlanco()){
				ret = ret.toUpperCase();
			}
		}else{
			ret = "·";
		}
		
		return ret;
	}
	
	private void dibujarLogJugadores(){
		System.out.println("Jugador Blanco");
		for(LogMovimiento s : tablero.getJugadorBlanco().getLogMovimientos()){
			System.out.println(traducir(s.getDesde())+" "+traducir(s.getHasta()));
		}
		
		System.out.println("Jugador Negro");
		for(LogMovimiento s : tablero.getJugadorNegro().getLogMovimientos()){
			System.out.println(traducir(s.getDesde())+" "+traducir(s.getHasta()));
		}
	}
	
	private String traducir(Posicion desde) {
	 return letras[desde.getY()]+(1+desde.getX());
	}

	public void dibujarFinal() {
		if(tablero.getJugadorBlanco().isTimeUp()){
			System.out.println("Se termino el tiempo del jugador blanco");
			System.out.println("Gano jugador negro");
		}else if(tablero.getJugadorNegro().isTimeUp()){
			System.out.println("Se termino el tiempo del jugador negro");
			System.out.println("Gano jugador blanco");
		}else{
			System.out.println("JAQUE MATE");
			System.out.println("Gano jugador " + getColorGanador());
		}
		dibujarLogJugadores();
	}
	
}
